Zavirani childoken v MDI aplikaci.

Otázka od: Ing. Igor Vodička

14. 10. 2002 11:03

Zdravim vsechny delfisty.

Muze mi nekdo poradit nebo nakopnout s jednou veci.
Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
snizen o pocet prave zavrenych oken.

Jak to provest, aby se v aplikaci okamzite po zavreni childokna aktualizoval
celkovy pocet MDIchildoken.

Predem dik za rady

Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.401 / Virová báze: 226 - datum vydání: 9.10.2002

Odpovedá: CERMAK

14. 10. 2002 17:19

Neni problem spise v pouziti cyklu for. Mam takovy pocit, ze je prelozen
tak, ze si program spocita pocet opakovani a pak bezi bez ohledu na to, jak
se uvnitr cyklu meni meze. Zkusil bych pouzit cyklus while.

 
                     Jaromir Cermak

                  

-----Original Message-----
From: Ing. Igor Vodička [mailto:vodicka@sagit.cz]
Sent: Monday, October 14, 2002 10:09 AM
To: Delphi konference II
Subject: Zavirani childoken v MDI aplikaci.


Zdravim vsechny delfisty.

Muze mi nekdo poradit nebo nakopnout s jednou veci.
Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
snizen o pocet prave zavrenych oken.

Odpovedá: ing. Jan Fiala

14. 10. 2002 11:44

To neni cyklem. MDIChildCount se nemeni okamzite. Taky jsem na to
narazil. Nastesti mam v programu i zalozky, takze jsem se prestal
ridit pomoci MDIChildCount a zacal jsem se ridit podle zalozek, ktere
se vytvari a zanikaji s child oknem.

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

14.10.2002 CERMAK:
> Neni problem spise v pouziti cyklu for. Mam takovy pocit, ze je prelozen
> tak, ze si program spocita pocet opakovani a pak bezi bez ohledu na to, jak
> se uvnitr cyklu meni meze. Zkusil bych pouzit cyklus while.

Odpovedá: Michal Sefcik

14. 10. 2002 17:49

Jednoduse to proved takto:

  while MDIChildCount > 0 do
    MDIChildren[0].Free;

> Muze mi nekdo poradit nebo nakopnout s jednou veci.
> Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
> Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to

MDIChildCount vraci pocet oken spravne, problem muze byt spise v naslednem
pouziti promenne I a indexovani Child oken ???

Odpovedá: Jan Sebelík

14. 10. 2002 23:11

> Odesílatel: Ing. Igor Vodička <vodicka@sagit.cz>
> Kdyz zaviram childokna, jednotlive nebo hromadne v cyklu (for I :=
> Form.MDIChildCount-1 downto 0 do ...) potrebuji v procedure, ktera to
> provadi (udalost Close nebo procedura pro hromadny close), zjistit pocet
> childoken. Funkce MDIChildCount, ale nevraci spravny pocet. Pocet oken neni
> snizen o pocet prave zavrenych oken.

Je to pruzracne, pokud se podivame na metodu Close do zdrojaku.
Close okno fakticky nezavre, jenom posle aplikaci message.

for i:=0 to MDIChildCount-1 do
  MDIChildren[i].Close;

tedy probehne pro vsechna okna, ve fronte zprav je prislusny pocet messages,
okna ale ve skutecnosti zavrena jeste nejsou, MDIChildCount se tedy opravnene
nemeni. Po ukonceni procedury si aplikace "slizne" messages a okna se
pozaviraji.

Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem rikal:

for i:=0 to MDIChildCount-1 do begin
  MDIChildren[i].Close;
  Application.ProcessMessages;
...

V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na Access
Violation (nebo neco podobneho), protoze v cyklu prelezu pres puvodni
MDIChildCount.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: ing. Jan Fiala

15. 10. 2002 5:01

14.10.2002 Jan Sebelík:
> Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem
rikal:

> for i:=0 to MDIChildCount-1 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;
> ...

> V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na
> Access Violation (nebo neco podobneho), protoze v cyklu prelezu pres
> puvodni MDIChildCount.

Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus

for i:=MDIChildCount-1 downto 0 do begin
  MDIChildren[i].Close;
  Application.ProcessMessages;

--
Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Jan Sebelík

15. 10. 2002 9:56

> Odesílatel: ing. Jan Fiala <jan.fiala@iol.cz>
> Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus
> for i:=MDIChildCount-1 downto 0 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;

Ale vzdyt jsem psal, ze reseni
> > for i:=0 to MDIChildCount-1 do begin
> > MDIChildren[i].Close;
> > Application.ProcessMessages;
vede k Access Violation.

Je to jenom ukazka, ktera ucastnikum "Zakladniho kurzu Delphi" vyjasni
mechanismus posilani zprav.
Bez toho ProcessMessages to funguje i bez "downto", s ProcessMessages
samozrejme ne.
A o to jde...  

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
----------
> Odesílatel: ing. Jan Fiala <jan.fiala@iol.cz>
> Komu: delphi-l@clexpert.cz
> Předmět: Re: Zavirani childoken v MDI aplikaci.
> Datum: 15. října 2002 6:00
>
> 14.10.2002 Jan Sebelík:
> > Netvrdim, ze nasledujici reseni je dobre, jenom dokumentuje to, co jsem
rikal:
>
> > for i:=0 to MDIChildCount-1 do begin
> > MDIChildren[i].Close;
> > Application.ProcessMessages;
> > ...
>
> > V tomto pripade se MDIChildCount bude snizovat a cyklus skonci na
> > Access Violation (nebo neco podobneho), protoze v cyklu prelezu pres
> > puvodni MDIChildCount.
>
> Ale jako bys nevedel, ze v takovych pripadech se pouziva cyklus
>
> for i:=MDIChildCount-1 downto 0 do begin
> MDIChildren[i].Close;
> Application.ProcessMessages;
>
> --
> Jan Fiala
> mailto:jan.fiala@iol.cz

Odpovedá: ing. Jan Fiala

15. 10. 2002 20:52

15.10.2002 Jan Sebelík:
> Ale vzdyt jsem psal, ze reseni
>> > for i:=0 to MDIChildCount-1 do begin
>> > MDIChildren[i].Close;
>> > Application.ProcessMessages;
> vede k Access Violation.

> Je to jenom ukazka, ktera ucastnikum "Zakladniho kurzu Delphi" vyjasni
mechanismus posilani zprav.
> Bez toho ProcessMessages to funguje i bez "downto", s ProcessMessages
samozrejme ne.
> A o to jde...  

Mozna je to taky tim, jak se k tomu postavi kompilator. Pokud
promennou v cyklu nevyuzivas, optimalizator cyklus obrati. Mozna
Application.ProcessMessages zpusobi, ze k obraceni nedojde a pak to
skonci na Access Violation. Ale to by se chtelo povrtat ve vyslednem
strojovem kodu...

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Petr Vones

15. 10. 2002 21:21

From: "ing. Jan Fiala" <jan.fiala@iol.cz>
> promennou v cyklu nevyuzivas, optimalizator cyklus obrati. Mozna
> Application.ProcessMessages zpusobi, ze k obraceni nedojde a pak to

Application.ProcessMessages hlavne zpusobi naprosty zmatek, protoze se zpravy
zacnou vyrizovat v kodu, ktery byl take spusten z Application.ProcessMessages
atd ...

Petr Vones